package com.flow.asyncflow.core.utils.ocr;


import com.flow.asyncflow.core.utils.file.FileUtil;
import org.json.JSONArray;
import org.json.JSONObject;


import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class AsyncFlowOcrUtil {


    //region 户口本OCR识别

    /**
     * 户口本OCR识别
     *
     * @param imageUrl 在线文件地址
     * @return 识别结果
     */
    public static Map<String, String> registerOCR(String imageUrl) {

        String imageBase64 = FileUtil.imageUrlToBase64(imageUrl);
        // base64转byte[]
        assert imageBase64 != null;
        byte[] byteArray2 = Base64.getDecoder().decode(imageBase64);
        return registerOCR(byteArray2);

    }

    /**
     * 户口本OCR识别
     *
     * @param imageByte 字节流
     * @return 识别结果
     */
    public static Map<String, String> registerOCR(byte[] imageByte) {
        //户口本模板ID
        String templateSign = "ffd93f04e99da357e341a33f8c3f8dfa";
        return customOCR(imageByte, templateSign);

    }
    //endregion

    //region 身份证OCR识别

    /**
     * 身份证姓名页OCR
     *
     * @param imageUrl 在线文件地址
     * @return 识别结果
     */
    public static Map<String, String> idCard_Front_OCR(String imageUrl) {

        String imageBase64 = FileUtil.imageUrlToBase64(imageUrl);
        // base64转byte[]
        assert imageBase64 != null;
        byte[] byteArray2 = Base64.getDecoder().decode(imageBase64);
        return idCard_Front_OCR(byteArray2);

    }

    /**
     * 身份证姓名页OCR
     *
     * @param imageByte 字节流
     * @return 识别结果
     */
    public static Map<String, String> idCard_Front_OCR(byte[] imageByte) {
        Map<String, String> resMap = new HashMap<>();
        //身份证模板ID
        String templateSign = "id_card_front";
        return customOCR(imageByte, templateSign);

    }

    /**
     * 身份证国徽页OCR
     *
     * @param imageUrl 在线文件地址
     * @return 识别结果
     */
    public static Map<String, String> idCard_Back_OCR(String imageUrl) {

        String imageBase64 = FileUtil.imageUrlToBase64(imageUrl);
        // base64转byte[]
        assert imageBase64 != null;
        byte[] byteArray2 = Base64.getDecoder().decode(imageBase64);
        return idCard_Back_OCR(byteArray2);

    }

    /**
     * 身份证国徽页OCR
     *
     * @param imageByte 字节流
     * @return 识别结果
     */
    public static Map<String, String> idCard_Back_OCR(byte[] imageByte) {
        //户口本模板ID
        String templateSign = "id_card_back";
        return customOCR(imageByte, templateSign);

    }
    //endregion

    //region 护照OCR识别

    /**
     * 护照OCR识别
     *
     * @param imageUrl 在线文件地址
     * @return 识别结果
     */
    public static Map<String, String> passportOCR(String imageUrl) {

        String imageBase64 = FileUtil.imageUrlToBase64(imageUrl);
        // base64转byte[]
        assert imageBase64 != null;
        byte[] byteArray2 = Base64.getDecoder().decode(imageBase64);
        return passportOCR(byteArray2);

    }

    /**
     * 护照OCR识别
     *
     * @param imageByte 字节流
     * @return 识别结果
     */
    public static Map<String, String> passportOCR(byte[] imageByte) {
        //护照模板ID
        String templateSign = "9ab87da180ceb262f62c128935d61f2f";
        return customOCR(imageByte, templateSign);

    }
    //endregion

    //region 结婚证OCR识别

    /**
     * 结婚证OCR识别
     *
     * @param imageUrl 在线文件地址
     * @return 识别结果
     */
    public static Map<String, String> marriageOCR(String imageUrl) {

        String imageBase64 = FileUtil.imageUrlToBase64(imageUrl);
        // base64转byte[]
        assert imageBase64 != null;
        byte[] byteArray2 = Base64.getDecoder().decode(imageBase64);
        return marriageOCR(byteArray2);

    }

    /**
     * 结婚证OCR识别
     *
     * @param imageByte 字节流
     * @return 识别结果
     */
    public static Map<String, String> marriageOCR(byte[] imageByte) {
        //结婚证模板ID
        String templateSign = "f74f6ccf2f4ca3dbc3815a99115fc74e";
        return customOCR(imageByte, templateSign);

    }
    //endregion

    //region 请求百度OCR识别

    /**
     * 请求百度OCR识别
     *
     * @param imageByte    字节流
     * @param templateSign iOCR模板
     * @return 识别结果
     */
    private static Map<String, String> customOCR(byte[] imageByte, String templateSign) {
        Map<String, String> resMap = new HashMap<>();

        JSONObject jsonObject = BaiDuOcrUtil.customOCR(imageByte, templateSign);
        if (jsonObject.getJSONObject("data") != null
                && jsonObject.getJSONObject("data").getJSONArray("ret") != null) {
            JSONArray idInfoList = jsonObject.getJSONObject("data").getJSONArray("ret");
            for (int i = 0; i < idInfoList.length(); i++) {
                JSONObject sub = idInfoList.getJSONObject(i);
                resMap.put(sub.getString("word_name"), sub.getString("word"));
            }
        }
        return resMap;
    }
    //endregion


}
